
// TODO
// 1. var url param keys
// 2. lancer la recherche
// 3. adapter moteur de recherche 1
function RechercheClasse() {
	this.urlParams = null;
	
	this.filtreTags = [];
	this.filtrePays = [];
	this.filtreRegions = [];
	this.listeRegionsNonFiltree = [];
	this.filtreActivites = [];
	this.filtreThematiques = [];
	this.libelleRegionParDefaut = [ {'libelleRegions' : 'Aucune région de disponible', 'checkboxDisabled': true} ];
}

RechercheClasse.prototype.init = function() {
	return this;
};

RechercheClasse.prototype.initListes = function(donnees) {
	if( typeof donnees == "undefined" || donnees == null) return this;

	this.filtrePays = donnees.paysUtil;
	this.filtreRegions = this.libelleRegionParDefaut;
	this.listeRegionsNonFiltree = angular.copy( donnees.regionsUtil );
	this.filtreActivites = donnees.activitesUtil;
	this.filtreThematiques = donnees.thematiquesUtil;

	return this;
}

// ensuite on sélectionne les filtres ds les listes de la recherche
RechercheClasse.prototype.FiltresUrlVersListes = function() {
	var urlParams = this.QueryString();

	this.TagsVersListe( urlParams );

	this.MultichoixVersListe( urlParams, 'pays', this.filtrePays, new ChoixElementClasse().pays() );
	
	this.filtreRegions = this.filtrerLesRegionsSelonLePays();

	this.MultichoixVersListe( urlParams, 'regions', this.filtreRegions, new ChoixElementClasse().regions() );
	this.MultichoixVersListe( urlParams, 'activites', this.filtreActivites, new ChoixElementClasse().activites() );
	this.MultichoixVersListe( urlParams, 'thematiques', this.filtreThematiques, new ChoixElementClasse().thematiques() );
}

RechercheClasse.prototype.nombreDeFiltresTags = function() {	
	return this.filtreTags.length > 0;
};

RechercheClasse.prototype.auMoinsUnFiltreSaisie = function() {	
	return this.filtreTags.length > 0 
			|| this.filtrePays.length > 0 
			|| this.filtreRegions.length > 0 
			|| this.filtreThematiques.length > 0 
			|| this.filtreActivites.length > 0;
};

RechercheClasse.prototype.filtrerListeElementSelectionnes = function(listesNonFiltrees) {	
	return _.where( listesNonFiltrees , { 'estSelect': true });
};

RechercheClasse.prototype.preparerLesFiltresTags = function(filtresListe) {
	this.filtreTags = this.formaterFiltresEnTableau( filtresListe, new ChoixElementClasse().tags() );
}

RechercheClasse.prototype.preparerLesFiltres = function(filtresListe) {
	if(filtresListe == null) return ;

	this.filtrePays = this.adapteurElementsMultiple( filtresListe.paysUtil, new ChoixElementClasse().pays() );

	this.filtreRegions = this.adapteurElementsMultiple(filtresListe.regionsUtil, new ChoixElementClasse().regions() );
	// this.filtreRegions = _.remove(this.filtreRegions, function(n) { return typeof n.idPays != 'undefined'; });//retirer les entêtes des groupes

	this.filtreActivites = this.adapteurElementsMultiple( filtresListe.activitesUtil, new ChoixElementClasse().activites() );

	this.filtreThematiques = this.adapteurElementsMultiple( filtresListe.thematiquesUtil, new ChoixElementClasse().thematiques() );
};

RechercheClasse.prototype.adapteurElementsMultiple = function(elementsNonFiltres, typeElement) {
	
	var listeSelectionnee = this.filtrerListeElementSelectionnes(elementsNonFiltres);

	var ret = this.formaterFiltresEnTableau(listeSelectionnee, typeElement);

	return ret;
};

RechercheClasse.prototype.formaterFiltresEnTableau = function(liste, typeElement) {
	var listeSelectionneeFormatee = [];

	angular.forEach( liste, function(ligne, key) {

		var t = typeElement.associerElementValeurs(ligne);

		if( typeof t != "undefined") {
	  		listeSelectionneeFormatee.push( t );
		}

	}, this, listeSelectionneeFormatee, typeElement)

	return listeSelectionneeFormatee;
}

RechercheClasse.prototype.retrouverLesFiltresDuneRecherche = function(elementsASelectionner, filtreListes, listeRegionsNonFiltree) {
	
	filtreListes.paysUtil = this.adapteurSelectionnerElementsFiltres( elementsASelectionner.filtrePays, filtreListes.paysUtil, new ChoixElementClasse().pays() );

	filtreListes.regionsUtil = this.filtrerLesRegionsSelonLePays();
	filtreListes.regionsUtil = this.adapteurSelectionnerElementsFiltres( elementsASelectionner.filtreRegions, filtreListes.regionsUtil, new ChoixElementClasse().regions() );
	
	filtreListes.thematiquesUtil = this.adapteurSelectionnerElementsFiltres( elementsASelectionner.filtreThematiques, filtreListes.thematiquesUtil, new ChoixElementClasse().thematiques() );
	filtreListes.activitesUtil = this.adapteurSelectionnerElementsFiltres( elementsASelectionner.filtreActivites, filtreListes.activitesUtil, new ChoixElementClasse().activites() );

	return filtreListes;
}

RechercheClasse.prototype.adapteurSelectionnerElementsFiltres = function(elementsNonFormate, liste, typeElement) {

	var elementsFormate = [];

	angular.forEach( liste, function(ligne, key) {

		var elementTrouve = _.where( elementsNonFormate , typeElement.associerElementValeurs(ligne) ); 

		if( elementTrouve.length > 0 ) {
			elementTrouve[0]['estSelect'] = true;

			elementsFormate.push(elementTrouve[0]);
		} else {
			elementsFormate.push(ligne);

		}

	}, elementsNonFormate, elementsFormate)

	return elementsFormate;
}

RechercheClasse.prototype.filtrerLesRegionsSelonLePays = function() {
	
	var paysSelectionnes = _.where( this.filtrePays, { 'estSelect': true });
    var indicateurNbreRegionsAffiche = 0;
    var regionsUtil = null;

    regionsUtil = [ {libelleRegions: '<strong>Sélectionner une ou plusieurs régions</strong>', paysGroup: true},];
    
    var that = this;                                
    angular.forEach(paysSelectionnes, function(value, key) {

        var debutLibelleGroup = {libelleRegions: '<strong>' + value.libellePays + '</strong>', paysGroup: true};
        var finLibelleGroup = {paysGroup: false};
        var donneesRegions = _.where( this.listeRegionsNonFiltree, { 'idPays': value.idPays });

        regionsUtil = regionsUtil.concat( debutLibelleGroup );
        regionsUtil = regionsUtil.concat( donneesRegions );
        regionsUtil = regionsUtil.concat( finLibelleGroup );

        indicateurNbreRegionsAffiche = indicateurNbreRegionsAffiche + donneesRegions.length;
    }, this);

    var regionsUtil = regionsUtil.concat( {paysGroup: false} );

    if(indicateurNbreRegionsAffiche == 0) {
        regionsUtil = this.libelleRegionParDefaut;
    }

    this.filtreRegions = regionsUtil;

    return regionsUtil;
}


RechercheClasse.prototype.ListesVersFiltresUrl = function( choixMajUrl ) {
	var query = window.location.search;

	this.urlParams = this.QueryString();

	// Maj des Params ds l'URL
	this.FiltresVersUrl( this.filtreTags, 'tags', new ChoixElementClasse().tags() );
	this.FiltresVersUrl( this.filtreActivites, 'activites', new ChoixElementClasse().activites() );
	this.FiltresVersUrl( this.filtreThematiques, 'thematiques', new ChoixElementClasse().thematiques() );
	this.FiltresVersUrl( this.filtrePays, 'pays', new ChoixElementClasse().pays() );
	this.FiltresVersUrl( this.filtreRegions, 'regions', new ChoixElementClasse().regions() );
	
	return this.MajUrl( choixMajUrl );
}

RechercheClasse.prototype.MajUrl = function (choixMajUrl) {
	var that = this;
	var cpt = 0;
	var url = '?';

	angular.forEach( this.urlParams, function(ligne, key) {

		if(ligne != null) {
			if( cpt > 0 ) {
				url = url + '&' + key + '=' + ligne;
			} else {
				url = url + key + '=' + ligne;
			}
			cpt++;
		}
		
	}, that, cpt, url);

	if( choixMajUrl == false ) {
		return url;
	}

	if( cpt == 0 ) {
		that.ChangerUrl("Résultats", '/r' );
	} else {
		that.ChangerUrl("Résultats", url );
	}

}

RechercheClasse.prototype.FiltresVersUrl = function (filtres, cle, typeDElement) {

	if( cle != 'tags' ) {
		filtres = this.filtrerListeElementSelectionnes( filtres );
	}

	var tab = this.formaterFiltresEnTableau( filtres, typeDElement );

	if( tab.length === 0) {
		this.urlParams[cle] = null;
	} else {
		this.urlParams[cle] = encodeURIComponent( tab.toString() );
	}
}

RechercheClasse.prototype.TagsVersListe = function ( urlParams ) {
	
	if( typeof urlParams.tags == "undefined" || urlParams == null ) return ;

	var tags = decodeURIComponent( urlParams.tags ).split(",");
	var typeElement = new ChoixElementClasse().tags();

	var that = this;
	angular.forEach( tags, function(ligne, key) {
		that.filtreTags.push( typeElement.associerValeurVersElement(ligne) );
	}, that);
}

RechercheClasse.prototype.MultichoixVersListe = function ( urlParams, cle, listeDeDepart, typeDElement ) {
	
	if( typeof urlParams[cle] == "undefined" || urlParams == null ) return ;

	var paramVal = decodeURIComponent( urlParams[cle] ).split(",");
	
	var that = this;
	angular.forEach( paramVal, function(id, key) {
		
		var codeId = {};

		codeId[typeDElement.code] = id;
		
		var item = _.where( listeDeDepart , codeId)[0];

		item['estSelect'] = true;

	}, that);

}

RechercheClasse.prototype.QueryString = function () {

  var query_string = {};

  var query = window.location.search.substring(1);

  var vars = query.split("&");

  for (var i=0;i<vars.length;i++) {
    var pair = vars[i].split("=");
        // If first entry with this name
    if (typeof query_string[pair[0]] === "undefined") {
      query_string[pair[0]] = pair[1];
        // If second entry with this name
    } else if (typeof query_string[pair[0]] === "string") {
      var arr = [ query_string[pair[0]], pair[1] ];
      query_string[pair[0]] = arr;
        // If third or later entry with this name
    } else {
      query_string[pair[0]].push(pair[1]);
    }
  } 
    return query_string;
};

RechercheClasse.prototype.ChangerUrl = function(title, url) {
    if (typeof (history.pushState) != "undefined") {
        var obj = { Title: title, Url: url };
        history.pushState(obj, obj.Title, obj.Url);
    }
}